import { inherits } from 'util';
import { InstanceItem } from '../type/instancetypes';
export class InstanceFactory {
    /**
     * 实例工厂，用于存储实例对象
     * key: 类
     * 
     * value: 实例对象
     */

    public static factory: Map<unknown, InstanceItem> = new Map();

    /**
     * 添加单例到工厂
     * @param clazz -   实例对应的类
     * @param cfg -     实例配置对象
     * @param force -   是否覆盖之前的实例登记，`@Instance`装饰器具备最高优先级
     */
    public static addInstance(clazz: unknown, cfg: InstanceItem, force: boolean = false): void {
        // 如果已经存在，且不允许覆盖，则直接返回
        if (this.factory.has(clazz) && !force) {
            return;
        }
        // 如果已经存在，且允许覆盖，则删除原有的实例
        if (this.factory.has(clazz) && force) {
            this.factory.delete(clazz);
        }
        // 添加实例
        this.factory.set(clazz, cfg);
    }

    /**
     * 获取实例
     * @param clazz -   实例对应的类名
     * @param param -   参数数组
     * @returns         实例化的对象或null
     */
    public static getInstance(clazz: unknown, param: Array<unknown> = []): unknown {
        // 如果工厂中存在，则直接返回
        if (this.factory.has(clazz)) {
            return this.factory.get(clazz).instance;
        }
        // 如果工厂中不存在，则创建实例
        return this.getInstance(clazz, param);}
    
        
}
